我不明白,为什么以下正则表达式:
^*$
匹配字符串"127.0.0.1"?运用Regex.IsMatch("127.0.0.1", "^*$");
使用Expresso,它不匹配,这也是我所期望的.使用表达式^.*$
确实匹配字符串,我也期望.
从技术上讲,^*$
应该匹配字符串/行的开头任意次,然后是字符串/行的结尾.似乎*被隐含地视为一个.*
我错过了什么?
编辑:运行以下命令以查看问题的示例.
using System; using System.Text.RegularExpressions; namespace RegexFubar { class Program { static void Main(string[] args) { Console.WriteLine(Regex.IsMatch("127.0.0.1", "^*$")); Console.Read(); } } }
我不希望有^*$匹配我的字符串,我想知道为什么它不匹配.我认为该表达式应该导致抛出异常,或者至少是不匹配.
编辑2:清除任何混乱.我没有写这个正则表达式,意图让它匹配"127.0.0.1".我们的应用程序的用户输入了表达式,并想知道为什么它不应该匹配字符串.看了之后,我无法解释为什么它匹配 - 特别是因为Expresso和.NET似乎不同地处理它.
我想这个问题是由于.NET实现避免抛出异常而得到回答,甚至认为它在技术上是一个不正确的表达式.但这真的是我们想要的吗?
好吧,理论上你是对的,它应该不匹配.但这取决于实施如何在内部运作.大多数正则表达式.将从前面取你的正则表达式并剥离^(注意它必须从字符串的开头匹配)并从末尾剥离$(注意它必须到字符串的结尾),遗留的只是"*"和"*"本身就是一个有效的正则表达式.您正在使用的实现对于如何处理它是错误的.你可以试试如果用"*"替换"^*$"会发生什么; 我想它也会匹配一切.似乎实现将单个星号视为".*".
根据ISO/IEC 9945-2:1993标准,它也在POSIX标准中描述,它被打破了.它被打破是因为标准说在^字符之后,星号没有任何特殊含义.这意味着"^*$"实际上只匹配一个字符串,这个字符串是"*"!
引用标准:
除非使用星号,否则星号是特殊的:
在括号表达式中
作为整个BRE的第一个字符(在初始^之后,如果有的话)
作为子表达式的第一个字符(在初始^之后,如果有的话); 看BRE匹配多个字符.
因此,如果它是第一个字符(并且^如果存在则不计为第一个字符),它没有特殊含义.这意味着在这种情况下,星号应该只匹配一个字符,这是一个星号.
微软说
Microsoft .NET Framework正则表达式包含其他正则表达式实现的最常用功能,例如Perl和awk中的那些..NET Framework正则表达式旨在与Perl 5正则表达式兼容,包括其他实现中尚未见到的功能,例如从右到左匹配和即时编译.
来源:http://msdn.microsoft.com/en-us/library/hs600312.aspx
好的,让我们测试一下:
# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^.*$)/)[0]),"\n";' -> 127.0.0.1 # echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^*$)/)[0]),"\n";' ->
不,它没有.Perl工作正常.^.*$匹配字符串,^*$不=> .NET的正则表达式实现被破坏,它不像Perl 5那样作为MS声明.
星号(*)匹配前面的元素ZERO或更多次.如果您想要一个或多个,请使用+运算符而不是*.
您要求它匹配字符串标记的可选开头和字符串标记的结尾.即如果我们省略字符串标记的开头,你只需要查找字符串标记的结尾...它将匹配任何字符串!
我真的不明白你想做什么.如果您可以提供更多信息,那么我可以告诉您应该做些什么:)